#include "func.h"

/////////////funcoes de erro/////////////////////////////


//se achar erro retorna 1
int verificaCurso(char *str)
{
	char* aux;
	int i;
	aux = str;	
	for(i=0;i<2;i++)
	{
		if(isdigit(str[i]) == 0)
		{
			printf("Erro! O Curso deve possuir somente caracteres numericos ou existe caractere faltando\n");
			return 1;
		}
	}
	str = aux;
	return 0;
}

//se achar erro retorna 1
int verificaNome (char *str, int n)
{
	char* aux;
	int i=0, t=0;
	//se for numero ou letra retorna naum 0
	aux = str;
	for (i = 0; i < n; i++)
	{
		if (str[i] != '.')
			if (isspace(str[i])==0)//eh espaco se for dif 0
				if (isalnum(str[i])==0) //tem pelo menos um caractere especial
				{
					str = aux;
					printf ("Campo em formato nao padrao\n");
					return 1;
				}
	}
	for (i = 0; i < n; i++)
		if (str[i] != ' ')
		{
			str = aux;
			return 0;
		}
	str = aux;
	return 1;
}

//se tiver erro, retorna 1
int verificaRA (char *str)
{
	char* aux;
	int i;
	aux = str;
	for (i = 0; i < 6; i++)
	{
		if (isdigit (str[i]) == 0)
		{
			printf ("Erro! O RA deve possuir somente caracteres numericos ou existem numeros faltando\n");
			return 1;
		}
	}
	
	str = aux;
	return 0;
}


//se der errado,retorna 1
int verificaSexo (char *str)
{
	char* aux;
	aux = str;

	if (str[0] == ' ')
	{
	    str = aux;
	    return 0;
	}
	else if (str[0] == 'M' || str[0] == 'm')
	{
	    str = aux;
	    return 0;
	}
	else if (str[0] == 'F' || str[0] == 'f')
	{
	    str = aux;
	    return 0;
	}
	else 
    {
		printf ("campo sexo invalido\n");
		str = aux;
		return 1;
    }
}

//se der errado, retorna 1
/*int verificaFIM (char *str)
{
    char* aux;

    aux = str;

    if (str[0] == '#')
	{
	    str = aux;
	    return 0;
    else 
    {
	printf ("campo sexo invalido\n");
	str = aux;
	return 1;
    }
}
*/
//////////////////////////////////////////////////////////
int GERA_ARQ_COM_SEPARADOR (cad strut, char*arq_saida)
{
	FILE *new_file;
	new_file = fopen (arq_saida, "a+");
	if (new_file == NULL)
	{
		printf(ferro);
		return 0;
	}
	else
	{
//ra
		fputs (strut->sra, new_file);
		fputs (bar, new_file);
//nome
		fputs (strut->snome, new_file);
		fputs (bar, new_file);
		if(strlen(strut->scidade)!=0)
		{
//cidade
			fputs (strut->scidade, new_file);
			fputs (bar, new_file);
		}
		else
			fputs (bar, new_file);
		if(strlen(strut->stel)!=0)
		{
	//tel
			fputs (strut->stel, new_file);
			fputs (bar, new_file);
		}
		else
			fputs (bar, new_file);    
		
		if(strlen(strut->stel_alt)!=0)
		{
//tel_alt
			fputs (strut->stel_alt, new_file);
			fputs (bar, new_file);
		}
		else
			fputs (bar, new_file);
//sexo
		fputs (strut->ssexo, new_file);
		fputs (bar, new_file);
//curso
		fputs (strut->scurso, new_file);
		fputs (bar, new_file);
//#
		fputs (fim, new_file);
		fputs (lf, new_file);
	}
	fclose(new_file);
	return 1;
}


void abre_arquivo(char *arq_entrada, char* arq_saida)
{
	FILE *ap_file;
	int i=0,t=0,func, verifica=0;
	cad pessoa, aux;
	
	pessoa = (cad)malloc(sizeof(cadastro));
	if(pessoa == NULL)
	{
		printf("Falta de memoria para alocacao.\n");
		exit(1);
	}
	
	ap_file = fopen(arq_entrada, "r+");
	if (ap_file==NULL)
	{
		printf(ferro);
		exit(1);
	}
	
	fseek(ap_file, 0, SEEK_END);
	t = ftell(ap_file);
	printf ("tamanho do arquivo %d bytes\n", t);
	fseek(ap_file,0 , SEEK_SET);
	//numero de registros
	t = t / linha;
	printf ("numero de cadastros %d\n", t);
	while(i<t)
	{
		aux = pessoa;
	//ra
		fgets (pessoa->sra, ra, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//nome
		fgets (pessoa->snome, nome, ap_file);
	//cidade
		fgets (pessoa->scidade, cidade, ap_file); 
	//tel
		fgets (pessoa->stel, tel, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//tel_alt
		fgets (pessoa->stel_alt, tel_alt, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//sexo
		fgets (pessoa->ssexo, sexo, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//curso
		fgets (pessoa->scurso, curso, ap_file); 
	
		pessoa->sra[6]='\0';
		pessoa->snome[24]='\0';
		pessoa->scidade[15]='\0';
		pessoa->stel[8]='\0';
		pessoa->stel_alt[8]='\0';
		pessoa->ssexo[1]='\0';
		pessoa->scurso[2]='\0';

	//funcao de arrumar a struct AQUI
		verifica = verificaRA(pessoa->sra);
		if(verifica)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaNome(pessoa->snome, strlen(pessoa->snome));
		if(verifica)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaSexo(pessoa->ssexo);
		if(verifica ==1)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaCurso(pessoa->scurso);
		if(verifica ==1)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
	
		
		str_spaces (pessoa->snome, nome);
		str_spaces (pessoa->scidade, cidade);
		str_spaces (pessoa->stel, tel);
		str_spaces (pessoa->stel_alt, tel_alt);
	
	//insere no arquivo de saida
		func = GERA_ARQ_COM_SEPARADOR(pessoa, arq_saida);
		if(func == 0)
			printf(ferro);
		fseek(ap_file, 3, SEEK_CUR);
		i++;
	}
	
	free(pessoa);//+++++++++++++++++++++++++++++++++++++++++++++++++++++
	fclose(ap_file);
	
	return;
}


void abre_arquivo2(char *arq_entrada, char* arq_saida)
{
	FILE *ap_file;
	int i=0,t=0,func, verifica=0;
	cad pessoa, aux;
	
	pessoa = (cad)malloc(sizeof(cadastro));
	if(pessoa == NULL)
	{
		printf("Falata de memoria para alocacao.\n");
		exit(1);
	}
	
	ap_file = fopen(arq_entrada, "r+");
	if (ap_file == NULL)
	{
		printf(ferro);
		exit(1);
	}
	
	fseek(ap_file, 0, SEEK_END);
	t = ftell(ap_file);
	printf ("tamanho do arquivo %d bytes\n", t);
	fseek(ap_file,0 , SEEK_SET);
	//numero de registros
	t = t / linha;
	printf ("numero de cadastros %d\n", t);
	
	while(i<t)
	{
		aux = pessoa;
	//ra
		fgets (pessoa->sra, ra, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//nome
		fgets (pessoa->snome, nome, ap_file);
	//cidade
		fgets (pessoa->scidade, cidade, ap_file); 
	//tel
		fgets (pessoa->stel, tel, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//tel_alt
		fgets (pessoa->stel_alt, tel_alt, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//sexo
		fgets (pessoa->ssexo, sexo, ap_file); 
		fseek(ap_file,1, SEEK_CUR);
	//curso
		fgets (pessoa->scurso, curso, ap_file); 
	
		pessoa->sra[6]='\0';
		pessoa->snome[24]='\0';
		pessoa->scidade[15]='\0';
		pessoa->stel[8]='\0';
		pessoa->stel_alt[8]='\0';
		pessoa->ssexo[1]='\0';
		pessoa->scurso[2]='\0';
	
	//funcao de arrumar a struct AQUI
		verifica = verificaRA(pessoa->sra);
		if(verifica)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaNome(pessoa->snome, strlen(pessoa->snome));
		if(verifica)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaSexo(pessoa->ssexo);
		if(verifica == 1)
		{
			i++;    fseek(ap_file,3, SEEK_CUR);
			continue;
		}
		verifica = verificaCurso(pessoa->scurso);
		if(verifica == 1)
		{
			i++;
			fseek(ap_file,3, SEEK_CUR);
			continue;
		}
	
	
	//insere no arquivo de saida
		func = GERA_ARQ_COM_SEPARADOR(pessoa, arq_saida);
		if(func == 0)
			printf(ferro);
		
		fseek(ap_file,3, SEEK_CUR);
		i++;
	}
	
	free(pessoa);//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	fclose(ap_file);
	return;
}

//funcao que tira o os espacos do vetor str de tamanho n 

void str_spaces(char *str, int n)
{
	char *str1;
	int i=0, j=0;
	//o tamanho da string sera
	str1 = (char*)malloc(sizeof(char)*n);
	if(str1 == NULL)
	{
		printf("Falta memoria para alocacao.\n");
		exit(1);
	}
	
	while(str[i]!='\0')
	{
	//retira cada duplo ou mais espacos entre palavras e arruma a string numa nova string
		if(j==0)
		{
			while (j == 0 && str[i] == ' ')
				i++;
		}
		if(str[i] == ' ' && str[i+1] == ' ')
			++i;
		else
		{
			if(str[i]=='\0' && j==0)
			{
				str1[j]='\0';
				j++;
				break;
			}
			str1[j] = str[i];
			j++;
			i++;
		}

	}
	//insere \0 no final da string para poder utilizar funcoes para string
	if(str1[j-1]==' ')
		str1[j-1]='\0';
	else
		str1[j-1]='\0';
	
	strcpy(str, str1);
	free(str1);//+++++++++++++++++++++++++++++++++++++++++++++++++
	return;
}

void GERA_ARQ_COMPACTO(FILE *f, char *input)
{
	char *aux;
	int i=1;
	
	char *str = (char*)malloc(sizeof(char)*100);
	if(str == NULL)
	{
		printf("Falta memoria para alocacao\n");
		exit(1);
	}
	
	FILE *fout = fopen(input, "w");
	if(fout == NULL)
	{
		perror(ERROR);
		exit(1);
	}
	
	fgets(str, 100, f);
	
	while(!feof(f))
	{
		//RA
		aux = strtok(str, "|");
 		str_spaces(aux, ra);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		i++;
		//NOME
		aux = strtok(NULL, "|");
 		str_spaces(aux, nome);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		i++;
		//CIDADE
		aux = strtok(NULL, "|");
		str_spaces(aux, cidade);
		if(strlen(aux) == 0)
			printf("%s", aux);
		else
		{
 			str_spaces(aux, cidade);
			fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		}
		i++;
		//TEL
		aux = strtok(NULL, "|");
 		str_spaces(aux, tel);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		i++;
		//TEL ALT
		aux = strtok(NULL, "|");
 		str_spaces(aux, tel_alt);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		i++;
		//SEXO
		aux = strtok(NULL, "|");
 		str_spaces(aux, sexo);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		i++;
		//CURSO
		aux = strtok(NULL, "|#");
 		str_spaces(aux, curso);
		fprintf(fout, "%d%02d%s", i,strlen(aux), aux);
		//FECHAMENTO
		fprintf(fout,"#\n");
		fgets(str, 100, f);
		fflush(fout);
		i=1;
	}
	free(str);
	fclose(fout);
}

void GERA_ARQ_FIXO(FILE *f, char *input)
{
	char *aux;
	int i=1;
	
	char *str = (char*)malloc(sizeof(char)*100);
	if(str == NULL)
	{
		printf("Falta memoria para alocacao.\n");
		exit(1);
	}
		
	FILE *fout = fopen(input, "w");
	if(fout == NULL)
	{
		perror(ERROR);
		exit(1);
	}
	
	fgets(str, 100, f);
	
	while(!feof(f))
	{
		//RA
		aux = strtok(str, "|");
		fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//NOME
		aux = strtok(NULL, "|");
		fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//CIDADE
		aux = strtok(NULL, "|");
		if(!strcmp("",aux))
			printf("%s", aux);
		else
			fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//TEL
		aux = strtok(NULL, "|");
		fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//TEL ALT
		aux = strtok(NULL, "|");
		fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//SEXO
		aux = strtok(NULL, "|");
		fprintf(fout, "%d%02d%s ", i,strlen(aux), aux);
		i++;
		
		//CURSO
		aux = strtok(NULL, " #");
		
		//FECHAMENTO
		fprintf(fout,"#\n");
		fgets(str, 100, f);
		fflush(fout);
		i=1;
	}
	fclose(fout);//++++++++++++++++++++++++++++++++++++++++++++
	free(str);//+++++++++++++++++++++++++++++++++++++++++++++++++
}


void imprimir_arquivo(char *name)
{
	char str[TAMLINHA];
	FILE *f = fopen(name, "r");
	if(f == NULL)
	{
		perror(ERROR);
		exit(1);
	}
	while(fgets(str, 70, f)!= NULL)
		printf("%s", str);
	
	fclose(f);
}


/* PROBLEMA AQUI*/
void extract_pk(char *name, char *indice)
{
	int pos, i;
	char str[300];
	//abre o arquivo de informacao
	FILE *f = fopen (name, "r");
	if (f == NULL)
		exit(1);
	//abre o arquivo de indice
	FILE *s = fopen (indice, "w");
	if (s == NULL)
		exit(1);
	
	fseek (f, 0 , SEEK_SET);
	
	while (!feof(f))
	{
		if (pos = ftell(f))
			pos++;
		
		fseek (f, 3, SEEK_CUR);
		
		if (fgets (str, 300, f) == NULL)
			break;
		
		str[6]=0;
		
		fprintf (s,"%s %d\n", str, pos);
		fflush(s);
	}
	fclose(s);
	fclose (f);
}

char* buscapk(char *str){
  FILE *apt = fopen(textoent,"r");
  if (apt==NULL)
  {
    printf(ferro2);
		  fclose(apt);
    return NULL;
  }
  int i;
  char vetor[rax+1];
  char posicao[espa];
  while(!feof(apt)){
    fgets(vetor,rax+1,apt);
    vetor[rax] = '\0';
    //printf("%s\n",vetor);
    i=strcmp(vetor,str);
    //printf("%d\n",i);
    if(i==0){
      printf(existx);
      fgets(posicao,rax+4,apt);
      //printf("%s\n",posicao);
      //system("PAUSE");
			  fclose(apt);
      return posicao;
    }
    fgets(vetor,rax+4,apt);

  }
  printf(nexistx);
  //system("PAUSE");
  fclose(apt);
  return NULL;
}